/*************************************************************************
	> File Name: server.c
	> Author: 
	> Mail: 
	> Created Time: Sat 10 Apr 2021 09:05:19 PM CST
 ************************************************************************/

#include "head.h"

int main() {
	int listen_sock, sock_fd;
	listen_sock = socket_create(10086);

	struct sockaddr_in client;
	socklen_t len = sizeof(client);
	while (1) {
		if ((sock_fd = accept(listen_sock, (struct sockaddr *)&client, &len)) < 0) {
			perror("accept");
			exit(1);
		}
		printf("%s is online\n", inet_ntoa(client.sin_addr));
        pid_t pid;
        if ((pid = fork()) < 0) {
            exit(1);
        }
        if (pid == 0) {
            close(listen_sock);
            while(1) {
                char buff[512] = {0};
                char tobuff[1024] = {0};
                // 子进程中循环接受信息
                size_t ret = recv(sock_fd, buff, sizeof(buff), 0);
                // 等于0说明没有东西， 小于0说明出错了
                if (ret <= 0) {
                    printf("<%s> is offline\n", inet_ntoa(client.sin_addr));
                    close(sock_fd);
                    exit(1);
                }
                printf("<%s> : %s\n", inet_ntoa(client.sin_addr), buff);
                // sprintf(tobuff, "I have recved your message : %s", buff);
                // // 反向发送给客户端已经接受到的信息
                // send(sock_fd, tobuff, strlen(tobuff), 0);
            }
        } else {
            // printf("<Parent> : 什么也不干...\n");
            // 这里是可以关闭的，会增加程序的健壮性； 因为这个socket文件描述符在子进程中也有一个链接，所以此时关闭的话，链接数不为1，此文件描述符不会真的关闭
            close(sock_fd);
        }		
	}

	return 0;
}

